// pages/menu/homePage/homePage.js
// 点餐-逻辑层

import util from '../../../utils/util'
const app = getApp();

//++++++++++++++++ 点餐联动列表 +++++++++++++++

// 模拟服务器数据(假数据/记得在onload里请求服务器)
const constants = require('../../../utils/constants');

// 右侧每一类的 bar 的高度（固定）
const RIGHT_BAR_HEIGHT = 20;

// 右侧每个子类的高度（固定）
const RIGHT_ITEM_HEIGHT = 110;

// 左侧每个类的高度（固定）
const LEFT_ITEM_HEIGHT = 50

//+++++++++++++++++++++ END ++++++++++++++++++

Page({


  /**
   * 页面的初始数据
   */
  data:
  {


    //++++++++++++++++ 点餐联动列表 +++++++++++++++

    // 是否显示下面的购物车
    HZL_isCat: 0,

    // 购物车的商品
    HZL_my_cat: null,

    // 购物车的数量
    HZL_num: null,

    // 左 => 右联动 右scroll-into-view 所需的id
    HZL_toView: null,

    // 右侧每类数据到顶部的距离（用来与 右 => 左 联动时监听右侧滚动到顶部的距离比较）
    HZL_eachRightItemToTop: [],
    HZL_leftToTop: 0,

    // 当前左侧选择的
    HZL_currentLeftSelect: null,   
 
    // 数据(必须在onload里获取)
    // 因为需要赋值且指定id(否则列表乱套)
    constants: [],

    // 底部金额计算
    money: null,//总金额
    money_virtual: null,//总金额(侧边)虚拟金额-10

    //+++++++++++++++++++++ END ++++++++++++++++++


    
    //+++++++++++++ 商品详情弹出层 +++++++

    show: false,//模态框是否显示
    currentMerchandise: 
    {
      index:null,
      parentIndex:null,
      name:null,
      describe:null,
      image:null,
      sales:null,
      money:null
    },//当前商品数据对象
    //++++++++++++++++++ END ++++++++++++

  },


    //+++++++++++++ 从全局数据获取用户购物车 +++
    
    /**
    * 0: 店里吃
    * 1: 拿走吃
    * 2: 送到家
     */
    userPattern:null, 

    //++++++++++++++++++ END ++++++++++++++++

  
    //+++++++++++++ 从全局数据获取用户购物车 +++

    /**
     * 从全局数据拿数据并赋值
     * [setData]
     */
    getUserCat: function()
    {

      // 拿数据
      let DATA = app.globalData.userCat;
      
      // 更新数据
      this.setData({
        HZL_my_cat: DATA.HZL_my_cat,//购物车的商品
        HZL_num: DATA.HZL_num,//购物车的数量
        money: DATA.money,//购物车金额合计
        money_virtual: DATA.money_virtual//购物车虚拟价格
      })

    },

    //++++++++++++++++++ END ++++++++++++++++







  //+++++++++++++ 商品详情弹出层 +++++++++++++
  
  /**
   * 开启弹出层
   * @return void
   */
  showPopup(e)
  {

    /**
     * 加入购物车(判断)
     */
    var flag = e.currentTarget.dataset.flag;//加入购物车标识(由详情页[加入购物车按钮]带入)

    if(flag)
    {

      // 获取id(在当前商品对象上)
      let index = this.data.currentMerchandise.index;
      let parentIndex = this.data.currentMerchandise.parentIndex;

      var HZL_my_cat = this.HZL_my_jia(parentIndex, index)
      
      // 金额计算
      var data = this.data.constants
      var money1 = data[parentIndex].category[index].category_money// 获取金额
      
      // 虚拟金额(带删除线)
      var money_virtual =  util.accAdd(money1,10)
  
      this.setData({
        HZL_num: this.data.HZL_num,
        HZL_my_cat: HZL_my_cat,
        constants: this.data.constants,
        // 调用util封装的计算方法(解决精度丢失)
        // 金额数值更新
        money: util.accAdd(this.data.money, money1),
        money_virtual: util.accAdd(this.data.money, money_virtual),
  
      })

      this.onClose();//关闭模态框
      this.cartWwing();//执行购物车摆动动画

    /**
     * 将数据写入全局数据(globalData)
     */
    let DATA = app.globalData.userCat;

    DATA.HZL_my_cat = this.data.HZL_my_cat
    DATA.HZL_num = this.data.HZL_num
    DATA.money = this.data.money
    DATA.money_virtual = this.data.money_virtual

    }

    else
    {
      // 获取数据(data-id)
      let name = e.currentTarget.dataset.name;// 菜名
      let describe = e.currentTarget.dataset.describe;// 描述
      let image = e.currentTarget.dataset.image;//图片
      let sales = e.currentTarget.dataset.sales;//月销量
      let money = e.currentTarget.dataset.money;//价格

      /**
       * 加入购物车所需id
       */
      var index = e.currentTarget.dataset.index;
      var parentIndex = e.currentTarget.dataset.parentindex;


      // 往对象里添加
      this.data.currentMerchandise.name = name
      this.data.currentMerchandise.describe = describe
      this.data.currentMerchandise.image = image
      this.data.currentMerchandise.sales = sales
      this.data.currentMerchandise.money = money

      this.data.currentMerchandise.index = index
      this.data.currentMerchandise.parentIndex = parentIndex
      
      this.setData({ 
        show: true, 
        currentMerchandise: this.data.currentMerchandise 
      });
    }

  },

  /**
   * 关闭弹出层
   * @return void
   */
  onClose()
  {
    this.setData({ 
      show: false, 
    })
  },

  //+++++++++++++++++ END ++++++++++++++++



  // +++++++++++++++++ 页面跳转相关 +++++++++++

  /**
   * 跳转到搜索详情页(点击搜索框)
   * @return void
   */
  toSearchDetailsPage: function()
  {
    wx.navigateTo({
      url: '/pages/menu/searchDetails/searchDetails'
    })
  },

  /**
   * 跳转到支付页(判断用餐模式)
   * 跳转到不同支付页
   * @return void
   */
  toPayment:function()
  {
    
  /**
   * 0: 店里吃
   * 1: 拿走吃
   * 2: 送到家
   */
  
   // 获取用户用餐模式
   let index = this.data.userPattern

   // 购物车数据转码(因为存在 ? & =)
   // 会导致数据传递过去后丢失

   // 跳转对应支付页面
   switch(true)
   {
     case index == 0:
       {
        wx.navigateTo({
          url: '/pages/payment/D0/D0?cat=' + encodeURIComponent(JSON.stringify(this.data.HZL_my_cat)) + '&moneyNum=' + this.data.money
        });break;
       }
     case index == 1:
       {
        wx.navigateTo({
          url: '/pages/payment/N1/N1?cat=' + encodeURIComponent(JSON.stringify(this.data.HZL_my_cat)) + '&moneyNum=' + this.data.money
        });break;
       }
     case index == 2:
       {
        wx.navigateTo({
          url: '/pages/payment/S2/S2?cat=' + encodeURIComponent(JSON.stringify(this.data.HZL_my_cat)) + '&moneyNum=' + this.data.money
        });break;
       }
   }

  },

  // ++++++++++++++++++++ END ++++++++++++++++


  





  //+++++++++++++++++ 点餐联动列表 ++++++++++++++

    /**
   * 记录swiper滚动
   */
  HZL_swiperchange: function(e)
  {
    var that = this;
    that.setData({
      HZL_swiper_ID: e.detail.current,
    })
  },

  
  /**
   * 点击分类栏
   */
  HZL_categories:function(e)
  {
    var that = this;
    that.setData({
      HZL_swiper_ID: e.currentTarget.dataset.index
    })
  },


  /**
   * 获取每个右侧的 bar 到顶部的距离，
   * 用来做后面的计算。
   */
  HZL_getEachRightItemToTop: function ()
  {
    var obj = {};
    var totop = 0;
    // 右侧第一类肯定是到顶部的距离为 0
    obj[constants[0].id] = totop     
    // 循环来计算每个子类到顶部的高度
    for (let i = 1; i < (constants.length + 1); i++) {  
      totop += (RIGHT_BAR_HEIGHT + constants[i - 1].category.length * RIGHT_ITEM_HEIGHT)
      // 这个的目的是 例如有两类，最后需要 0-1 1-2 2-3 的数据，所以需要一个不存在的 'last' 项，此项即为第一类加上第二类的高度。
      obj[constants[i] ? constants[i].id : 'last'] = totop    
    }
    return obj
  },


  /**
   * 监听右侧的滚动事件与 HZL_eachRightItemToTop 的循环作对比
   * 从而判断当前可视区域为第几类，从而渲染左侧的对应类
   */
  right: function (e)
  {   
    for (let i = 0; i < this.data.constants.length; i++) {
      let left = this.data.HZL_eachRightItemToTop[this.data.constants[i].id]
      let right = this.data.HZL_eachRightItemToTop[this.data.constants[i + 1] ? this.data.constants[i + 1].id : 'last']
      if (e.detail.scrollTop < right && e.detail.scrollTop >= left) {
        this.setData({
          HZL_currentLeftSelect: this.data.constants[i].id,
          HZL_leftToTop: LEFT_ITEM_HEIGHT * i
        })
      }
    }
  },


  /**
   * 左侧类的点击事件，
   * 点击时，右侧会滚动到对应分类
   */
  left: function (e)
  {    
    this.setData({
      HZL_toView: e.target.id || e.target.dataset.id,
      HZL_currentLeftSelect: e.target.id || e.target.dataset.id
    })
  },


  /**
   * 去结算(先判断安全后跳转)
   * @return void
   */
  go: function()
  {

    // 用户购物车(包含选择的商品)
    // console.log(this.data.HZL_my_cat)

    /**
     * 一些处理判断
     */
    
    
     /**
      * 跳转支付页
      */
     this.toPayment();

  },


  /**
   * 是否显示下面的购物车
   */
  HZL_isCat:function(e)
  {
    var that = this;
    


    if (that.data.HZL_isCat == 0 && that.data.HZL_num > 0) {
      that.setData({
        HZL_isCat: 1
      })
    } else if (that.data.HZL_isCat == 1 && that.data.HZL_num > 0) {
      that.setData({
        HZL_isCat: 0
      })
    }
  
  },



  /**
   * 黑背景模态墙点外侧关闭
   */
  HZL_isCat_close:function(e)
  {
    this.setData({
      HZL_isCat: 0
    })
  },


  /**
   * 清空购物车
   */
  HZL_zero:function(e)
  {

    for (var i = 0; i < this.data.constants.length; i++) {
      for (var j = 0; j < this.data.constants[i].category.length; j++) {
        this.data.constants[i].category[j].num = 0
      }
    }
    this.setData({
      HZL_isCat: 0,
      HZL_num: 0,
      HZL_my_cat: [],
      constants: this.data.constants,
      money:0
    })

    /**
     * 将数据写入全局数据(globalData)
     */
    let DATA = app.globalData.userCat;

    DATA.HZL_my_cat = this.data.HZL_my_cat
    DATA.HZL_num = this.data.HZL_num
    DATA.money = this.data.money
    DATA.money_virtual = this.data.money_virtual

    // 反馈提示
    wx.showToast({
      title:'已清空~',
      icon: 'none'
    })
  },


  /**
   * 增加数量按钮
   */
  HZL_jia:function(e)
  {
    var index = e.currentTarget.dataset.index;
    var parentIndex = e.currentTarget.dataset.parentindex;
    var HZL_my_cat = this.HZL_my_jia(parentIndex, index)

    // 金额计算
    var data = this.data.constants
    var money = data[parentIndex].category[index].category_money// 获取金额
    
    // 虚拟金额(带删除线)
    var money_virtual =  util.accAdd(money,10)

    this.setData({
      HZL_num: this.data.HZL_num,
      HZL_my_cat: HZL_my_cat,
      constants: this.data.constants,
      // 调用util封装的计算方法(解决精度丢失)
      // 金额数值更新
      money: util.accAdd(this.data.money, money),
      money_virtual: util.accAdd(this.data.money, money_virtual),

    })
    this.cartWwing();//执行动画

    /**
     * 将数据写入全局数据(globalData)
     */
    let DATA = app.globalData.userCat;

    DATA.HZL_my_cat = this.data.HZL_my_cat
    DATA.HZL_num = this.data.HZL_num
    DATA.money = this.data.money
    DATA.money_virtual = this.data.money_virtual

  },


  /**
   * 减少数量按钮
   */
  HZL_jian:function(e)
  {
    var index = e.currentTarget.dataset.index;
    var parentIndex = e.currentTarget.dataset.parentindex;
    var HZL_my_cat = this.HZL_my_jian(parentIndex, index)

    if (this.data.HZL_num == 0) {
      this.data.HZL_isCat = 0;
    } else {
      this.data.HZL_isCat = 1;
    }

    // 金额计算
    var data = this.data.constants
    var money = data[parentIndex].category[index].category_money// 获取金额

    // 虚拟金额(带删除线)
    var money_virtual = util.accSub(money,10)

    this.setData({
      HZL_num: this.data.HZL_num,
      HZL_my_cat: HZL_my_cat,
      constants: this.data.constants,
      // 调用util封装的计算方法(解决精度丢失)
      // 金额数值更新
      money: util.accSub(this.data.money, money),
      money_virtual: util.accSub(this.data.money, money_virtual),
    })

    /**
     * 将数据写入全局数据(globalData)
     */
    let DATA = app.globalData.userCat;

    DATA.HZL_my_cat = this.data.HZL_my_cat
    DATA.HZL_num = this.data.HZL_num
    DATA.money = this.data.money
    DATA.money_virtual = this.data.money_virtual

  },


  /**
   * 下面购物车增加按钮
   */
  HZL_jia1: function (e)
  {
    var index = e.currentTarget.dataset.index;
    var parentIndex = e.currentTarget.dataset.parentindex;
    var HZL_my_cat = this.HZL_my_jia(parentIndex, index)    

    // 金额计算
    var data = this.data.constants
    var money = data[parentIndex].category[index].category_money// 获取金额

    this.setData({
      HZL_num: this.data.HZL_num,
      HZL_my_cat: HZL_my_cat,
      constants: this.data.constants,
      // 调用util封装的计算方法(解决精度丢失)
      money: util.accAdd(this.data.money, money)
    })
    this.cartWwing();//执行动画

    /**
     * 将数据写入全局数据(globalData)
     */
    let DATA = app.globalData.userCat;

    DATA.HZL_my_cat = this.data.HZL_my_cat
    DATA.HZL_num = this.data.HZL_num
    DATA.money = this.data.money
    DATA.money_virtual = this.data.money_virtual
    
  },


  /**
   * 下面购物车减少按钮
   */
  HZL_jian1: function (e)
  {
    var index = e.currentTarget.dataset.index;
    var parentIndex = e.currentTarget.dataset.parentindex;
    var HZL_my_cat = this.HZL_my_jian(parentIndex, index)

    if (this.data.HZL_num == 0) {
      this.data.HZL_isCat = 0;
      
    } else {
      this.data.HZL_isCat = 1;
    }

    // 金额计算
    var data = this.data.constants
    var money = data[parentIndex].category[index].category_money// 获取金额

    this.setData({
      HZL_num: this.data.HZL_num,
      HZL_my_cat: HZL_my_cat,
      constants: this.data.constants,
      HZL_isCat: this.data.HZL_isCat,
      // 调用util封装的计算方法(解决精度丢失)
      money: util.accSub(this.data.money, money)
    })

    /**
     * 将数据写入全局数据(globalData)
     */
    let DATA = app.globalData.userCat;

    DATA.HZL_my_cat = this.data.HZL_my_cat
    DATA.HZL_num = this.data.HZL_num
    DATA.money = this.data.money
    DATA.money_virtual = this.data.money_virtual

  },


  /**
   * 封装加的方法
   * 并将商品添加到数组中
   */
  HZL_my_jia: function (parentIndex, index)
  {
    this.data.HZL_num++;
    var index = index;

    // 商品组ID
    var parentIndex = parentIndex;

    // 商品ID
    var id = this.data.constants[parentIndex].category[index].category_id;

    // 商品图片链接
    var img = this.data.constants[parentIndex].category[index].category_img;

    // 商品价格
    var money = this.data.constants[parentIndex].category[index].category_money;

    // 商品名称
    var name = this.data.constants[parentIndex].category[index].category_name;

    // 商品数量
    var num = ++ this.data.constants[parentIndex].category[index].num;

    //弄一个元素判断会不会是重复的
    var mark = 'a' + index + 'b' + parentIndex + 'c' + '0' + 'd' + '0'
    // 临时对象()
    var obj = {
      mark: mark,
      index: index, 
      parentIndex: parentIndex, 
      img: img, 
      name: name,
      num: num, 
      money: money 
    };
    var HZL_my_cat = this.data.HZL_my_cat;
    HZL_my_cat.push(obj)

    var arr = [];
    //去掉重复的
    for (var i = 0; i < HZL_my_cat.length; i++) {
      if (obj.mark == HZL_my_cat[i].mark) {
        HZL_my_cat.splice(i, 1, obj)
      }
      if (arr.indexOf(HZL_my_cat[i]) == -1) {
        arr.push(HZL_my_cat[i]);
      }
    }
    return arr
  },


  /**
   * 封装减的方法
   */
  HZL_my_jian: function (parentIndex, index)
  {
    this.data.HZL_num--;
    var index = index;

  // 商品组ID
  var parentIndex = parentIndex;

  // 商品ID
  var id = this.data.constants[parentIndex].category[index].category_id;

  // 商品图片链接
  var img = this.data.constants[parentIndex].category[index].category_img;

  // 商品价格
  var money = this.data.constants[parentIndex].category[index].category_money;

  // 商品名称
  var name = this.data.constants[parentIndex].category[index].category_name;

  // 商品数量
  var num = -- this.data.constants[parentIndex].category[index].num;
    //弄一个元素判断会不会是重复的
    var mark = 'a' + index + 'b' + parentIndex + 'c' + '0' + 'd' + '0'

    // 临时对象()
    var obj = {
      mark: mark,
      index: index, 
      parentIndex: parentIndex, 
      img: img, 
      name: name,
      num: num, 
      money: money 
    };

    var HZL_my_cat = this.data.HZL_my_cat;
    HZL_my_cat.push(obj)

    var arr = [];
    //去掉重复的
    for (var i = 0; i < HZL_my_cat.length; i++) {
      if (obj.mark == HZL_my_cat[i].mark) {
        HZL_my_cat.splice(i, 1, obj)
      }
    }
    

    var arr1 = [];
    //当数量大于1的时候加
    for (var i = 0; i < HZL_my_cat.length; i++) {
      if (arr1.indexOf(HZL_my_cat[i]) == -1) {
        arr1.push(HZL_my_cat[i]);
        if (HZL_my_cat[i].num > 0) {
          arr.push(arr1[i])
        }
      }
    }

    return arr
  },

  //+++++++++++++++++++++ END ++++++++++++++++++









  //+++++++++++++++++ 动画效果库 ++++++++++++++
  
  /**
   * 点击商品+号购物车摆动
   * @return void 
   */
  cartWwing: function()
  {

    // 创建动画实例(animation)
    var animation = wx.createAnimation({
      duration: 100,//动画持续时间
      timingFunction: 'ease-in',//动画以低速开始
      //具体配置项请查看文档
    })

    // 通过实例描述对象()
    animation.translateX(6).rotate(21).step()
    animation.translateX(-6).rotate(-21).step()
    animation.translateX(0).rotate(0).step()

    // 导出动画
    this.setData({
      cartWwing: animation.export()
    })

  },

  /**
   * 点击购物车详情底部弹出动画
   * @return void
   */
  // eject: function()
  // {

  //   // 创建动画实例(animation)
  //   var animation = wx.createAnimation({
  //     duration: 3000,//动画持续时间
  //     timingFunction: 'ease-in',//动画以低速开始
  //     //具体配置项请查看文档
  //   })

  //   // 通过实例描述对象()
  //   animation.translateY(-750).step()

  //   // 导出动画
  //   this.setData({
  //     eject: animation.export()
  //   })

  // },

  //+++++++++++++++++++++ END ++++++++++++++++++







  

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function(options)
  {

    /**
     * 动态设置标题(用户用餐模式)
     * 0: 店里吃
     * 1: 拿走吃
     * 2: 送到家
     */
    // 如果id存在即为正常带参进入点餐页(否则抛出异常)
    switch(typeof(options.id) != undefined)
    {
       case options.id == 0:
       {
          wx.setNavigationBarTitle({
            title: '您选择了 [ 店里吃 ]'
          });break;
       }

       case options.id == 1:
       {
          wx.setNavigationBarTitle({
            title: '您选择了 [ 拿走吃 ]'
          });break;
       }

       case options.id == 2:
       {
          wx.setNavigationBarTitle({
            title: '您选择了 [ 送到家 ]'
          });break;
       }
      
       /**
        * 【用户非正常流程(危险！)】
        * 用户未从点餐页点击卡片进入！
        * 不允许继续操作(弹框退出)！
        */
       case options.id === undefined:
      //  {

      //   // 显示模态框(强制跳转页面)
      //   wx.showModal({
      //     showCancel:false,
      //     title: 'Error(x0x1x2)：非法操作！',
      //     content: '检测到环境异常，已被系统拦截，请重启小程序重试！',
      //     success(res)
      //     {
      //       // 跳出处理(返回到点餐页卡片界面)
      //       wx.switchTab({
      //         url:'/pages/menu/homePage/homePage'
      //       })
      //     }
      //   });break;
      //  }

    }


    this.getUserCat();
    
    /**
     * 点餐联动列表相关
     */
    var that = this;
    // 高度大小
    wx.getSystemInfo({
      success: function (res) {
        var HZL_height = res.windowHeight - 105
        var HZL_height1 = res.windowHeight - 55
        that.setData({
          HZL_height: HZL_height,
          HZL_height1: HZL_height1
        })
      }
    });

    // 获取服务器数据
    console.log('请求接口: 获取服务器数据')

    // 更新数据
    that.setData({

      // 将请求的服务器数据赋值更新
      constants: constants,
      HZL_currentLeftSelect: constants[0].id,

      HZL_eachRightItemToTop: this.HZL_getEachRightItemToTop(),

      // 用户用餐模式
      userPattern:options.id
    })

  },








  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function()
  {

  },








  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function()
  {
    
  },








  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function()
  {

  },








  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function()
  {

  },








  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function()
  {
    // 停止刷新显示(假更新数据)
    wx.stopPullDownRefresh()
  },







  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function()
  {
    
  },






  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function()
  {

  }

})